import re
from django.contrib.auth.backends import ModelBackend
from .models import User


def jwt_response_payload_handler(token, user=None, request=None):
    """
    自定义jwt认证成功返回的数据，需要修改配置文件
    """
    return {
        'token': token,
        'user_id': user.id,
        'username': user.username
    }


def get_user(account):
    """
    根据帐号获取user对象
    :param account: 账号，可以是用户名，也可以是手机号
    :return: User对象 或者 None
    """
    try:
        if re.match(r'1[3-9]\d{9}$', account):
            # 帐号为手机号
            user = User.objects.get(mobile=account)
        else:
            # 帐号为用户名
            user = User.objects.get(username=account)
    # 抛出异常
    except User.DoesNotExist:
        return None
    else:
        return user


# 自定义认证后端,用户名或手机号认证
# 增加支持用户名与手机号均可作为登录账号
class UsernameMobileAuthBackend(ModelBackend):
    """
       自定义用户名或手机号认证
       通过修改Django认证系统的认证后端（主要是authenticate方法）
       并在配置文件中告知Django使用我们自定义的认证后端
    """
    def authenticate(self, request, username=None, password=None, **kwargs):
        """
        request 本次认证的请求对象
        username 本次认证提供的用户账号
        password 本次认证提供的密码
        """

        # 只要存在就登录（get_user，上面已定义）
        user = get_user(username)

        # 调用User对象的check_password方法检查密码是否正确
        if user and user.check_password(password):
            return user
